package com.example.myshop.service.Imp;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.myshop.domain.CartDao;
import com.example.myshop.domain.ProductDao;
import com.example.myshop.entity.Cart;
import com.example.myshop.entity.Product;
import com.example.myshop.service.CartService;
import com.example.myshop.service.ex.AccessDeniedException;
import com.example.myshop.service.ex.CartNotFoundException;
import com.example.myshop.service.ex.InsertException;
import com.example.myshop.service.ex.UpdateException;
import com.example.myshop.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

@Service
public class CartServiceImp extends ServiceImpl<CartDao, Cart>implements CartService {
    @Autowired
    private CartDao cartDao;
    @Autowired
    private ProductDao productDao;


    @Override
    public void addToCart(Long uid, Long pid, Integer amount, String username) {
//查询当前要添加的该物品是否在表中已经存在
        QueryWrapper<Cart>queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("uid",uid);
        queryWrapper.eq("pid",pid);
        Cart result=cartDao.selectOne(queryWrapper);
        Date date = new Date();
        if(result==null){//表示该商品从未被添加到购物车中，进行新增插入
            //创建一个cart对象
            Cart cart=new Cart();
            //补全数据：参数传递的数据即uid，pid，amount
            cart.setUid(uid);
            cart.setPid(pid);
            cart.setNum(amount);//amount为商品的总数
            //价格来自于商品中的数据
            QueryWrapper<Product>queryWrapper1=new QueryWrapper<>();
            queryWrapper1.eq("id",pid);
            Product product= productDao.selectOne(queryWrapper1);
            cart.setPrice(product.getPrice());
            //补全四个日志
            cart.setCreatedUser(username);
            cart.setCreatedTime(date);
            cart.setModifiedUser(username);
            cart.setModifiedTime(date);

            //数据插入
            Integer rows= cartDao.insert(cart);
            if (rows!=1){
                throw new InsertException("插入数据时产生位置异常");
            }
        }else {//表示当前商品在购物车中已经存在，则更新该条数据的num值
            //进行原有数据和现有传递的数据进行相加操作
            Integer num= result.getNum()+amount;
            UpdateWrapper<Cart>updateWrapper=new UpdateWrapper<>();
            updateWrapper.eq("cid",result.getCid());
            updateWrapper.set("num",num);
            updateWrapper.set("modified_time",new Date());
            updateWrapper.set(" modified_user",username);
            Integer rows=cartDao.update(null,updateWrapper);
            if(rows!=1){
                throw new UpdateException("更新数据时产生未知异常");
            }
        }
    }

    @Override
    public List<CartVO> getVOByUid(Long uid) {
        return cartDao.findVOByUid(uid);
    }

    @Override
    public void delCartItem(Long cid) {
        QueryWrapper<Cart>queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("cid",cid);
        Cart cart=cartDao.selectOne(queryWrapper);
        UpdateWrapper<Cart>updateWrapper=new UpdateWrapper<>();
        updateWrapper.eq("cid",cid);
        updateWrapper.set("modified_user",cart.getCreatedUser());
        updateWrapper.set(" modified_time",new Date());
        cartDao.update(null,updateWrapper);
        Integer rows =cartDao.delete(queryWrapper);
        if(rows!=1){
            System.out.println("删除错误！");
        }
    }

    @Override
    public Integer addNum(Long cid, Long uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        QueryWrapper<Cart>queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("cid",cid);
        Cart result = cartDao.selectOne(queryWrapper);
        // 判断查询结果是否为null
        if(result==null){
            throw new CartNotFoundException("数据不存在");
        }
        // 判断查询结果中的uid与参数uid是否不一致
        if(!result.getUid().equals(uid)){
            throw new AccessDeniedException("数据非法访问");
        }
        // 根据查询结果中的原数量增加1得到新的数量num
        Integer num= result.getNum()+1;
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        UpdateWrapper<Cart>updateWrapper=new UpdateWrapper<>();
        updateWrapper.eq("cid",cid);
        updateWrapper.set("num",num);
        updateWrapper.set("modified_user",username);
        updateWrapper.set("modified_time",new Date());
        Integer rows = cartDao.update(null,updateWrapper);
        if(rows!=1){
            throw new UpdateException("更新数据失败");
        }
        return num;
    }

    @Override
    public Integer reduceNum(Long cid, Long uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        Cart result = cartDao.selectById(cid);
        // 判断查询结果是否为null
        if(result==null){
            throw new CartNotFoundException("数据不存在");
        }
        // 判断查询结果中的uid与参数uid是否不一致
        if(!result.getUid().equals(uid)){
            throw new AccessDeniedException("数据非法访问");
        }
        // 根据查询结果中的原数量增加1得到新的数量num
        Integer num= result.getNum()-1;
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        UpdateWrapper<Cart>updateWrapper=new UpdateWrapper<>();
        updateWrapper.eq("cid",cid);
        updateWrapper.set("num",num);
        updateWrapper.set("modified_user",username);
        updateWrapper.set("modified_time",new Date());
        Integer rows = cartDao.update(null,updateWrapper);
        if(rows!=1){
            throw new UpdateException("更新数据失败");
        }
        return num;
    }

    @Override
    public List<CartVO> getVOByCid(Long uid, Long[] cids) {
        List<CartVO> list= cartDao.findVOByCids(cids);
        Iterator<CartVO> it=list.iterator();
        while (it.hasNext()){
            CartVO cartVO=it.next();
            if (!cartVO.getUid().equals(uid)) {//表示当前的数据不属于当前的用户
                //从集合中移除该元素
                it.remove();
            }
        }
        return list;
    }
}
